package kara;


import java.io.*;
//代码随想录103水流问题
//从边界dfs，把能逆向到达(低到高)的点标记为true
public class A103 {
    static int n;
    static int m;
    static int[][] map;
    static BufferedReader read=new BufferedReader(new InputStreamReader(System.in));
    static BufferedWriter log=new BufferedWriter(new OutputStreamWriter(System.out));
    static boolean[][] pacific;//能从第一组边界到达此位置+标记数组
    static boolean[][] atlantic;//能从第一组边界到达此位置+标记数组
    public static void main(String[] args) throws IOException {
        String[] split = read.readLine().split(" ");
        n=Integer.parseInt(split[0]);
        m=Integer.parseInt(split[1]);
        map=new int[n][m];
        pacific = new boolean[n][m];
        atlantic = new boolean[n][m];
        for(int i=0;i<n;i++){
            String[] s = read.readLine().split(" ");
            for(int j=0;j<m;j++){
                map[i][j]=Integer.parseInt(s[j]);
            }
        }
      for(int i=0;i<n;i++){
          dfs(pacific,i,0,Integer.MIN_VALUE);//左
         dfs(atlantic,i,m-1,Integer.MIN_VALUE);//右
      }
for(int j=0;j<m;j++){
    dfs(pacific,0,j,Integer.MIN_VALUE);//上
    dfs(atlantic,n-1,j,Integer.MIN_VALUE);//下
}
for(int i=0;i<n;i++){
    for(int j=0;j<m;j++){
        if(pacific[i][j]&&atlantic[i][j])
            log.write(i + " " + j + "\n");
    }
}
log.flush();
    }
//主函数不标记，头判断
    //x,y为当前要到达的点,preH指的从哪个高度的点过来
    static void dfs(boolean[][] vis,int x,int y,int preH){
        //超过边界或者访问过，返回
if(x<0||x>=n||y<0||y>=m||vis[x][y]==true)return;
//如果不能从低到高,返回
if(map[x][y]<preH)return;
//说明能到达map[x][y]了，标记
        vis[x][y]=true;
        //递归
        dfs(vis,x+1,y,map[x][y]);
        dfs(vis,x-1,y,map[x][y]);
        dfs(vis,x,y+1,map[x][y]);
        dfs(vis,x,y-1,map[x][y]);
    }

}
